gganimate es una extensión del paquete ggplot2 para crear ggplots animados. Proporciona una gama de nuevas funciones que se pueden agregar al gráfico para personalizar cómo debería cambiar con el tiempo.

Características clave de gganimate:

Implementación

Instalación

install.packages("gganimate")

Cargamos las librerías que vamos a utilizar

library(ggplot2)
library(gganimate)
library(gapminder)

Para ilustrar las principales funciones que podemos hacer con gganimate vamos a utilizar la base de datos de gapminder, la cual contiene diferentes datos demográficos como el continente, país, año, esperanza de vida, población total y el producto interno bruto per cápita en ese mismo año.

head(gapminder)
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.

Primero veamos una gráfica estática de nuestros datos

p1 <- ggplot(
  gapminder, 
  mapping = aes(x = gdpPercap, y=lifeExp, size = pop, colour = country)
  ) +
  geom_point(show.legend = FALSE, alpha = 0.7) + 
  #escalamos los datos para verlos con más claridad
  scale_size(range = c(2, 12)) + 
  scale_x_log10() +
  labs(x = "PIB per capita", y = "Esperanza de vida")
p1

Transiciones

Para ver la evolución de nuestros datos a través del tiempo resultan útiles las transiciones. En este caso utilizaremos la función transition_time(). En nuestro ejemplo la duraciónn de la transición se ajustarpa a la diferencia de tiempo entre ellos.

Junto con esta función utilizaremos la función de frame_time. Esta va mostrando en que parte del tiempo estamos parados en nuestra gráfica.

Observación: al correr los comandos “tal cual” nos arroja un NULL como resultado de nuesstra gráfica, esto se debe a que no contamos con alguna paquetería para visualizar objetos animados. Por lo que notamos una desventaja en gganimate; no incluye el soporte para renderizar objetos animos por sí mismo.

Para arreglar esto instalaremos alguna de las paqueterías recomendadas y ¡listo! Al hacer esto crea un objeto gif_image (un archivo .gif)

install.packages("gifski")

Buscamos que sea evidente el cambio en el PIB y para esto clasificamos nuestras gráficas por contiente. y agregamos los efectos de animación

p1 + facet_wrap(~continent) +
  transition_time(year) +
  labs(title = "Año: {frame_time}") 

Vistas y Sombras

Si queremos ver como se mueven los datos a través de cada frame usamos view_follow

p1 + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  view_follow(fixed_y = TRUE)

Para mostrar frames anteriores con falloff gradual (mini trazo de la procedencia de nuestros datos) usamos shadow_wake . Esta sombra está diseñada para dibujar una pequeña estela después de los datos al mostrar los últimos frames hasta el actual.

p1 + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_wake(wake_length = 0.1, alpha = FALSE)

También podemos mostrar el dataset original como marcas en el fondo, esto es útil cuando haces algun escalamiento de los datos como hicimos al inicio, para esto usamos shadow_mark

p1 + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_mark(alpha = 0.3, size = 0.5)

Revelar datos a lo largo de una dimensión dada

Este tipo de transición permite que los datos aprezcan de forma gradual, basado en una dimensión dada.

Para ilustrar estas funciones utilizaremos el dataset de airquality.

Pimero hacemos nuevamente un ggplot estático ocupando las variables de día y temperatura y argupándo por meses.

p2 <- ggplot(
  airquality,
  aes(Day, Temp, group = Month, color = factor(Month))
  ) +
  geom_line() +
  scale_color_viridis_d() +
  labs(x = "Día del mes", y = "Temperatura") +
  theme(legend.position = "top")
p2

Queremos que nuestros datos aparezcan de formal diaria gradualmente entoces usamos transition_reveal y podemos incluir los puntos en cada día explícitamente para mayor claridad, en este segundo tema tenemos 2 opciones, mostrar un punto en el día actual o mostrar la secuencia de puntos de todos los días.

Op. 1

p2 + 
  geom_point() +
  transition_reveal(Day)

Op. 2

p2 + 
  geom_point(aes(group = seq_along(Day))) +
  transition_reveal(Day)

Transición entre varias etapas distintas de los datos

Primero prepararemos los datos

library(dplyr)
temp.med <- airquality %>%
  group_by(Month) %>%
  summarise(Temp = mean(Temp))
temp.med
## # A tibble: 5 x 2
##   Month  Temp
##   <int> <dbl>
## 1     5  65.5
## 2     6  79.1
## 3     7  83.9
## 4     8  84.0
## 5     9  76.9

Hacemos un barplot estático del promedio de la temperatura

p3 <- ggplot(temp.med, aes(Month, Temp, fill = Temp)) +
  geom_col() +
  scale_fill_distiller(palette = "Reds", direction = 1) +
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    panel.grid.major.y = element_line(color = "white"),
    panel.ontop = TRUE
  )
p3

Lo convertimos a un barplot animado usando algunos de los comandos ya expuestos

p3 + transition_states(Month, wrap = FALSE) +
  shadow_mark() +
   ease_aes('cubic-in-out') # Slow start and end for a smoother look)

Por último para guardar las animaciones que hemos creado para poder usarlas después podemos usar la función anim_save. Funciona de manera similar a ggsave() de ggplot2 y si no se le especifica nada guarda la útilma animación renderizada.

Conclusiones